import Taro from '@tarojs/taro';
import * as sdk from 'api/fetch';
import config from '@/service/config';
import moment from 'dayjs';

type uploadRes = {
  context: String;
};

/**
 * 上传图片
 */
export default async function UploadImage(): Promise<uploadRes> {
  return new Promise(async (resolve, reject) => {
    let that = this;
    // if (data.isAdd) {
    ///查询当前已经有多少张图片
    // const { files, maxCount } = this.state;
    // const count = maxCount - files.length + 1;
    Taro.chooseImage({
      count: 1, // 默认9
      sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图，默认二者都有
      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机，默认二者都有，在H5浏览器端支持使用 `user` 和 `environment`分别指定为前后摄像头
      success: async function (res) {
        // 返回选定照片的本地文件路径列表，tempFilePath可以作为img标签的src属性显示图片
        var tempFilePaths = res.tempFilePaths;
        console.log('tempFilePaths====' + tempFilePaths);
        /// 图片压缩
        const tmpFiles: any = await compressfiles(res.tempFiles);
        /// 将选中的图片存在files中
        var tmpFileList = tmpFiles.map((file) => {
          return {
            url: file.path,
          };
        });
        /// 发起网络请求 将tag有值的数据进行上传 如果上传成功则移除tag值
        // 获取上传Token
        let { data } = await sdk.rzget('oss/sign', {});
        const successFiles = await (
          await uploadFile(tmpFileList, data.accessid, data.policy, data.signature)
        )
          .filter((item) => item.status === 'success')
          .map((item) => {
            delete item.status;
            delete item.tag;
            return item;
          });
        /// 成功的数量<=0则不在走下面流程
        if (successFiles && successFiles.length <= 0) return;
        /// 保存files的值并通知外部刷新数据源
        // resolve({ context: successFiles[0].url })
        resolve({ context: successFiles[0].url });
      },
    });
  });
}

/// 单个图片压缩
const compressfile = async (file) => {
  // let that = this;
  return new Promise((resolve, reject) => {
    /// 压缩图片  图片小于300k直接上传 如果大于300k则压缩图片大小
    const maxSize = 300 * 1024;
    const fileSize = file.size;
    if (fileSize > maxSize) {
      Taro.getImageInfo({
        src: file.path,
        success: async (data) => {
          //---------利用canvas压缩图片--------------
          var canvasWidth = data.width; //图片原始长宽
          var canvasHeight = data.height;
          // if (canvasWidth > 500) {
          //   canvasWidth = 500;
          //   canvasHeight = canvasHeight / (data.width / 500);
          // }
          // that.setState({
          //   canvasWidth,
          //   canvasHeight,
          // });
          let interval = 500;
          /// 时间处理 根据图片大小 在导出图片时延时一定时间后开始处理返回数据，防止数据未导出成功
          const kb = fileSize / 1000;
          if (kb < 1000) {
            interval = 500;
          } else {
            interval = kb / 20;
          }

          //----------绘制图形并取出图片路径--------------
          var ctx = Taro.createCanvasContext('myCanvas');
          ctx.drawImage(file.path, 0, 0, canvasWidth, canvasHeight);
          ctx.draw(
            false,
            // @ts-ignore
            setTimeout(() => {
              Taro.canvasToTempFilePath({
                canvasId: 'myCanvas',
                destWidth: canvasWidth,
                destHeight: canvasHeight,
                success: async function (data1) {
                  console.log(data1.tempFilePath);
                  resolve({
                    path: data1.tempFilePath,
                  });
                },
                fail: function (data1: any) {
                  // 压缩失败时上传基础缓存
                  console.log('压缩失败时上传基础缓存');
                  resolve({
                    path: file.path,
                  });
                },
              });
            }, interval),
          );
        },
      });
    } else {
      resolve(file);
    }
  });
};

/// 图片压缩
const compressfiles = async (uploadFiles = []) => {
  // let that = this;
  let files = [];
  const count = uploadFiles?.length || 0;
  Taro.showLoading({
    title: '压缩中...',
  });

  return new Promise(async (resolve, reject) => {
    for (let index = 0; index < count; index++) {
      const file = uploadFiles[index];
      const res = await compressfile(file);
      console.log(index);
      files.push(res);
      if (index === count - 1) {
        Taro.hideLoading();
        resolve(files);
      }
    }
  });
};

/// 发起图片上传 异步上传
const uploadFile = async (uploadFiles = [], accessId, policy, signature) => {
  Taro.showLoading({
    title: '图片上传中',
  });
  const promises = uploadFiles.map((data) => {
    return new Promise((resolve, reject) => {
      Taro.uploadFile({
        url: config.ossHost,
        filePath: data.url,
        name: 'file', // 必须填file。
        formData: {
          OSSAccessKeyId: accessId,
          policy,
          signature,
          key: `itsource/${data.url.slice(data.url.length / 2)}`,
          // 'x-oss-security-token': securityToken // 使用STS签名时必传。
        },
        success: (res) => {
          if (res.statusCode === 204) {
            data.status = 'success';
            data.url = `${config.ossHost}/itsource/${data.url.slice(data.url.length / 2)}`;
            resolve(data);
          }
        },
        fail: (err) => {
          console.log(err);
          Taro.showToast({
            title: '上传失败',
            icon: 'none',
            mask: true,
          });
          /// 上传失败
          data.status = 'fail';
          resolve(data);
        },
      });
    });
  });
  const list = await Promise.all(promises);
  Taro.hideLoading();
  return list;
};

const checkImage = async (tmpFileList = [], noti = false) => {
  return new Promise((resolve) => {
    ///1.拿到已经选中的file列表
    // let { files, maxCount, mode } = this.state;
    // ///2.移除之前的addFile
    // const newFiles = files.filter((item, index) => {
    //   return item.isAdd !== true;
    // });
    // ///3.合并列表
    // if (tmpFileList && tmpFileList.length > 0) {
    //   newFiles.push(...tmpFileList);
    // }
    // ///4.数据返回上级
    // if (this.props.onFileChange && noti) {
    //   this.props.onFileChange(newFiles);
    // }
    // ///5.判断新的addFile
    // files = JSON.parse(JSON.stringify(newFiles));
    // if (files.length < maxCount && mode === 'add') {
    //   /// 添加add按钮
    //   files.push(this.addFile());
    // }
    // /// 更新数据会有延迟 setTimeout来解决页面已经刷新 数据还没有变更过来的问题
    // setTimeout(() => {
    //   this.setState(
    //     {
    //       files,
    //     },
    //     () => {
    //       resolve(true);
    //     },
    //   );
    // }, 0);
  });
};

const addFile = () => {
  const addImg = 'https://pt-mini.oss-cn-hangzhou.aliyuncs.com/fram/ic_tyre_upload.png';
  return {
    url: addImg,
    isAdd: true,
  };
};

/// 点击删除
const onDeleteImage = (data) => {
  // const { files } = this.state;
  // const newFiles = files.filter((item) => {
  //   return item.url != data.url;
  // });
  // this.setState(
  //   {
  //     files: newFiles,
  //   },
  //   () => {
  //     this.checkImage([], true);
  //   },
  // );
};

// const taroUpload = async (resolve, reject, fileSize) => {
//   await Taro.showActionSheet({
//     itemList: ['从相册中选择', '拍照'],
//     itemColor: '#ff6600',
//     success: async function(res) {
//       if (!res.cancel) {
//         await chooseWxImage(res.tapIndex);
//       }
//     },
//   })
//     .then((res) => res)
//     .catch((err) => err);

//   async function chooseWxImage(tapIndex) {
//     const type = tapIndex ? 'camera' : 'album';
//     const token = Taro.getStorageSync('authInfo:token');
//     await Taro.chooseImage({
//       count: 1,
//       sizeType: ['original', 'compressed'],
//       sourceType: [type],
//       success: async function(res) {
//         let toUploadPath = res.tempFilePaths[0];
//         let fileName = res.tempFiles[0].path.toLowerCase();
//         //判断是否 是标准格式，是否超过文件大小
//         if (
//           fileName.endsWith('.jpg') ||
//           fileName.endsWith('.jpeg') ||
//           fileName.endsWith('.png') ||
//           fileName.endsWith('.gif')
//         ) {
//           if (res.tempFiles[0].size >= fileSize) {
//             if (fileSize == 500 * 1024 * 10) {
//               await Taro.showToast({
//                 title: '图片大小不能超过5M',
//                 icon: 'none',
//                 duration: 1000,
//               });
//             }
//             return;
//           }
//         } else {
//           await Taro.showToast({
//             title: '仅支持jpg、jpeg、png、gif文件',
//             icon: 'none',
//             duration: 1000,
//           });
//           return;
//         }

//         await Taro.uploadFile({
//           //@ts-ignore
//           url: `${config.host}/common/uploadResource?resourceType=IMAGE`, //测试
//           header: {
//             // 'content-type': 'multipart/form-data',
//             Authorization: 'Bearer ' + token, // 上传需要单独处理cookie
//           },
//           // url: '/common/uploadResource',
//           filePath: res.tempFilePaths[0],
//           formData: {},
//           name: 'uploadFile',
//           success: async function(res) {
//             const data = JSON.parse(res.data); //坑2：与wx.request不同，wx.uploadFile返回的是[字符串]，需要自己转为JSON格式
//             resolve({context: data.context});
//           },
//           fail: async function(res) {
//             //失败后这个没有值 res.tempFilePaths[0]
//             setTimeout(async () => {
//               await Taro.showToast({
//                 title: 'fail: ' + JSON.stringify(res || {}) + '-' + toUploadPath,
//                 icon: 'none',
//                 duration: 3000,
//               });
//             }, 3000);
//             reject(res);
//           },
//         });
//       },
//     });
//   }
// };

// const h5Upload = (resolve, reject, fileSize) => {
//   (document.getElementById('uploadForm') as any).reset();
//   const uploadInput = document.getElementById('uploadInput');
//   uploadInput.onchange = async (e: any) => {
//     let files = e.target.files;
//     let fileName = files[0].name.toLowerCase();
//     //判断是否 是标准格式，是否超过文件大小
//     if (
//       fileName.endsWith('.jpg') ||
//       fileName.endsWith('.jpeg') ||
//       fileName.endsWith('.png') ||
//       fileName.endsWith('.gif')
//     ) {
//       if (files[0].size >= fileSize) {
//         if (fileSize == 500 * 1024 * 10) {
//           await Taro.showToast({
//             title: '图片大小不能超过5M',
//             icon: 'none',
//             duration: 1000,
//           });
//         }
//         return;
//       }
//     } else {
//       await Taro.showToast({
//         title: '仅支持jpg、jpeg、png、gif文件',
//         icon: 'none',
//         duration: 1000,
//       });
//       return;
//     }

//     if (files && files[0]) {
//       let formData = new FormData();
//       formData.append('uploadFile', files[0]);
//       const url = `${WMkit.prefixUrl(config.host)}/common/uploadResource?resourceType=IMAGE`;
//       fetch(url, {
//         method: 'POST',
//         body: formData,
//         headers: {
//           Authorization: 'Bearer ' + Taro.getStorageSync('authInfo:token'),
//         },
//       })
//         .then((res) => res.json())
//         .then((res) => resolve({context: res.context}))
//         .catch((err) => reject(err));
//     }
//   };
//   uploadInput.click();
// };
